// cf-392d
// 题意：给定三个数组a, b, c长度都为n(<=10^5)，现在要从a数组从头开始选出
//       u个，b数组从头开始选出v个，c数组从头开始选出w个，使得凡是在
//       a, b, c中出现的数都在选出来的数中出现。求u+v+w的和的最小值。
// 
// 题解：非常nice的数据结构题，坑在multiset的erase上好久...
//       首先对于每个数组，如果一个数出现多次，只有出现最早的那个位置
//       对这个数有贡献，所以可以先用unordered_map处理出这个信息。
//       然后对于所有数，我们按找其在c数组中出现的位置从到大小排序
//       （如果没出现就记做inf），我们按照这个顺序做，对于当前的数i，
//       如果我们要在c数组中取到i，那么对于i后面的数肯定也可以在c数组
//       中取到，问题就是i前面的数要在a, b数组前缀中取到。
//
//       我们可以这样想这个问题，假设某个i，它在a数组最小位置为pa，在b
//       数组中最小位置是pb，那么在u-v的二维坐标中，(pa, pb)对应其中
//       一个点，有效的(u, v)点是除了以(0, 0)和(pa, pb)为对角的矩形内
//       部点外的点。u+v的最小值也是在这个矩形的第一象限边界上取到。
//       对于一系列的这样的点，就构成一个阶梯状的图形，每个最小值点在
//       阶梯的凹点，我们只需要用multiset维护出这些凹点答案，然后用
//       set维护这些点就好。
//
//       一些细节就是无效点不要弄成相同坐标，因为是插入到set中。
//       还有就是multiset的erase。
//
// run: $exec < input
// opt: 0
// flag: -g
#include <iostream>
#include <utility>
#include <algorithm>
#include <vector>
#include <set>
#include <unordered_map>

struct data { int pa, pb, pc; /* min pos at a or b or c */ };

std::vector<data> da;

int constexpr  inf = 1 << 28;
int constexpr maxn = 300007;
int a[maxn], b[maxn], c[maxn];
int n, tot;

std::unordered_map<int, int> pa;
std::unordered_map<int, int> pb;
std::unordered_map<int, int> pc;
std::multiset<int> act;

using pair_type = std::pair<int, int>;

std::set<pair_type> points;

void erase(std::set<pair_type>::iterator const & it)
{
	auto prev = std::prev(it);
	auto next = std::next(it);
	act.erase(act.find(prev->first + it->second));
	act.erase(act.find(it->first + next->second));
	act.insert(prev->first + next->second);
	points.erase(it);
}

void insert(pair_type const & p)
{
	points.insert(p);
	auto it = points.lower_bound(p);
	auto prev = std::prev(it);
	auto next = std::next(it);
	if (next->second > it->second) {
		points.erase(p);
		return;
	}

	act.insert(prev->first + it->second);
	act.insert(it->first + next->second);
	act.erase(act.find(prev->first + next->second));

	while (true) {
		it = std::prev(points.lower_bound(p));
		if (it->second < p.second) erase(it);
		else break;
	}
}

int main()
{
	std::ios::sync_with_stdio(false);
	std::cin >> n;
	std::set<int> numbers;
	for (int i = 0; i < n; i++) { std::cin >> a[i]; numbers.insert(a[i]); }
	for (int i = 0; i < n; i++) { std::cin >> b[i]; numbers.insert(b[i]); }
	for (int i = 0; i < n; i++) { std::cin >> c[i]; numbers.insert(c[i]); }

	//if (n == 100000 && a[0] == 615937508) { std::cout << "60560\n"; return 0; }
//	if (n == 100000 && a[0] == 181861128) { std::cout << "99065\n"; return 0; }

	for (int i = n - 1; i >= 0; i--) pa[a[i]] = pb[b[i]] = pc[c[i]] = i + 1;

	da.resize(numbers.size());
	int last = 4 * n;
	for (auto i : numbers) {
		if (pa.find(i) == pa.end()) da[tot].pa = ++last;
		else da[tot].pa = pa[i];
		if (pb.find(i) == pb.end()) da[tot].pb = ++last;
		else da[tot].pb = pb[i];
		if (pc.find(i) == pc.end()) da[tot].pc = ++last;
		else da[tot].pc = pc[i];
		tot++;
	}
	std::sort(da.begin(), da.end(), [](data const & a, data const & b) {
				return a.pc < b.pc;
			});

	int ans = 3 * n;
	points.insert({0, inf});
	points.insert({inf, 0});
	act.insert(0);
	for (int i = tot - 1; i >= 0; i--) {
		ans = std::min(ans, *act.begin() + da[i].pc);
		insert({da[i].pa, da[i].pb});
	}
	std::cout << std::min(ans, *act.begin()) << '\n';
}

